home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / archiver / jampack4.lzh / jampack4 / ldrunlzh.s < prev   
Text File  |  1987-04-21  |  13KB  |  723 lines

  1. ; SIMPLE TRAP #1 FILE DEPACKER FOR JAM PACKER V3.0/4.0 LZH COMPRESSION.
  2. ; WILL ONLY WORK ON FILES WHICH ARE COMPLETELY READ BY ONE CALL TO
  3. ; FREAD (TRAP #1 #$3F).
  4.  
  5. savebuf        =    $200
  6. YES        equ    1
  7. NO        equ    0
  8. LSEEKROUTINE    EQU     YES    ;WHEN PROG USES LSEEK TO DETERMINE FILE LENGTH
  9. SFIRSTROUTINE    EQU    YES    ;WHEN PROG USES SFIRST TO DETERMINE FILE LENGTH
  10.  
  11. BEGINNING:
  12.  BRA.S    START
  13. fname: dc.b 'PLAYER.PRG',$00
  14.  EVEN
  15.  
  16. START:
  17.  MOVEA.L A7,A5 
  18.  LEA BEGINNING(PC),A7
  19.  MOVE.L 4(A5),A5
  20.  MOVE.L $C(A5),D0
  21.  ADD.L $14(A5),D0
  22.  ADD.L $1C(A5),D0
  23.  ADD.L #$100,D0
  24.  
  25.  MOVE.L  D0,-(A7)
  26.  MOVE.L  A5,-(A7)
  27.  MOVE.W  #$0000,-(A7)
  28.  MOVE.W  #$004A,-(A7)
  29.  TRAP    #1
  30.  ADDA.L  #$0000000C,A7
  31.  
  32.  clr.l -(sp)
  33.  move.w #$20,-(sp)
  34.  trap #1
  35.  addq.l #6,sp
  36.  move.l d0,d7
  37.  
  38.  MOVE.L    #$1600,-(SP)
  39.  MOVE.W #$48,-(SP)
  40.  TRAP #1        ;RESERVE SOME SPACE FOR LZH DEPACK TABLES
  41.  ADDQ.L #6,SP
  42.  MOVE.L D0,BUFPOS
  43.  
  44.  move.l $84.W,oldtrap1vector
  45.  move.l #trapit,$84.W
  46.  
  47.  move.l d7,-(sp)
  48.  move.w #$20,-(sp)
  49.  trap #1
  50.  addq.l #6,sp
  51.  
  52.  MOVE.L #NULL,-(SP)
  53.  MOVE.L #NULL,-(SP)
  54.  PEA    fname(PC)
  55.  MOVE.W #0,-(SP)
  56.  MOVE.W #$4B,-(SP)
  57.  TRAP    #1
  58.  add.l #14,sp
  59.  
  60. ;ENSURE THAT YOU CAN QUIT OUT OF PROGRAMS WITHOUT A CRASH
  61.  clr.l -(sp)
  62.  move.w #$20,-(sp)
  63.  trap #1
  64.  addq.l #6,sp
  65.  
  66.  move.l oldtrap1vector(pc),$84.w
  67.  
  68.  move.l d0,-(sp)
  69.  move.w #$20,-(sp)
  70.  trap #1
  71.  addq.l #6,sp
  72.  
  73.  clr.w -(sp)
  74.  trap #1
  75.  
  76. trapit:
  77.  btst #$05,(a7)
  78.  bne.S super
  79.  move.l usp,a0
  80.  bra.S after
  81. super:
  82.  move.l a7,a0
  83.  addq.l #6,a0
  84. after:
  85.  cmp.w #$3d,(a0)
  86.  beq doopen
  87.  cmp.w #$3f,(a0)
  88.  beq.s load
  89.  IFNE LSEEKROUTINE
  90.  cmp.w #$42,(a0)
  91.  beq.s down
  92.  ENDC
  93.  IFNE SFIRSTROUTINE
  94.  cmp.w #$4e,(a0)
  95.  beq.s dosfirst
  96.  cmp.w #$2f,(a0)
  97.  beq.s dogetdta
  98.  cmp.w #$1a,(a0)
  99.  ENDC
  100.  bne dotrap1
  101.  
  102.  IFNE SFIRSTROUTINE
  103.  lea retsetdta(pc),a0
  104.  move.l 2(a7),(a0)
  105.  lea setdta(pc),a0
  106.  move.l a0,2(a7)
  107.  bra dotrap1
  108.  
  109. dogetdta:
  110.  lea retgetdta(pc),a0
  111.  move.l 2(a7),(a0)
  112.  lea getdta(pc),a0
  113.  move.l a0,2(a7)
  114.  bra dotrap1
  115.  ENDC
  116.  
  117. doopen:
  118.  lea retopen(pc),a0
  119.  move.l 2(a7),(a0)
  120.  lea open(pc),a0
  121.  move.l a0,2(a7)
  122.  bra dotrap1
  123.  
  124. ;here starts the stuff for SFIRST
  125.  
  126.  IFNE SFIRSTROUTINE
  127. dosfirst:
  128.  lea retsfirst(pc),a0
  129.  move.l 2(a7),(a0)
  130.  lea sfirst(pc),a0
  131.  move.l a0,2(a7)
  132.  bra.s dotrap1
  133.  ENDC
  134.  
  135. ;here start the stuff for LSEEK
  136.  IFNE LSEEKROUTINE
  137. down:
  138.  lea retlseek(pc),a0
  139.  move.l 2(a7),(a0)
  140.  lea lseek(pc),a0
  141.  move.l a0,2(a7)
  142.  bra.s dotrap1
  143.  ENDC
  144.  
  145. load:
  146.  move.w inopen(pc),d0
  147.  cmp.w #1,d0
  148.  beq.s dotrap1            ;if checking depack marker, do real trap1!
  149.  move.w seekflag(pc),d0
  150.  cmp.w #1,d0
  151.  beq.s dotrap1            ;if called from seek handler, exit!
  152.  move.w mustdecrun(pc),d0
  153.  cmp.w #1,d0
  154.  bne.s dotrap1            ;if marker not present, don't decrunch!
  155.  
  156.  move.l a7,d0
  157.  movem.l a1-a3,-(sp) 
  158.  
  159.  sub.l #$20,8(a0)
  160.  lea buffer(pc),a1
  161.  move.l 8(a0),(a1)
  162.  
  163.  move.l d0,a2
  164.  lea return(pc),a1
  165.  move.l 2(a2),(a1)
  166.  lea decrunch(pc),a1
  167.  move.l a1,2(a2)
  168.  
  169.  move.l buffer(pc),a1
  170.  lea savebuf,a2
  171.  move.l #$20,a3
  172. loadloop:
  173.  move.b (a1)+,(a2)+
  174.  subq.l #1,a3
  175.  cmp.l #0,a3
  176.  bne.s loadloop
  177.  movem.l (sp)+,a1-a3
  178.  
  179. dotrap1:
  180.  dc.w $4ef9
  181. oldtrap1vector:
  182.  dc.l $00
  183.  
  184.  
  185. ;**************************
  186. open:
  187.  tst.l d0
  188.  bmi exitopen2
  189.  
  190.  movem.l a1-a3,-(sp)
  191.  move.l d0,a3
  192.  lea inopen(pc),a1
  193.  move.w #1,(a1)
  194.  
  195.  pea test(pc)
  196.  move.l #8,-(sp)
  197.  move.w a3,-(sp)
  198.  move.w #$3f,-(sp)
  199.  trap #1
  200.  add.l #12,sp
  201.  tst.l d0            ;ADDED TO FIX ZERO LENGTH FILE
  202.  beq.s notcrun            ;DITTO
  203.  
  204.  move.l magic(pc),d0
  205.  cmp.l test(pc),d0
  206.  bne.s notcrun
  207.  lea mustdecrun(pc),a1
  208.  move.w #1,(a1)
  209.  bra.s skipit
  210. notcrun:
  211.  lea mustdecrun(pc),a1
  212.  move.w #0,(a1)
  213. skipit:
  214.  
  215.  move.w #1,-(sp)
  216.  move.w a3,-(sp)
  217.  move.l #-8,-(sp)
  218.  move.w #$42,-(sp)
  219.  trap #1
  220.  add.l #10,sp
  221.  
  222.  move.l a3,d0
  223. exitopen:
  224.  lea inopen(pc),a1
  225.  move.w #0,(a1)
  226.  movem.l (sp)+,a1-a3
  227.  
  228. exitopen2:
  229.  dc.w $4ef9
  230. retopen:                               ;exit
  231.  dc.l $00
  232.  
  233. inopen:
  234.  dc.w 0
  235. test:
  236.  dc.l 0
  237. unpaklen:
  238.  dc.l 0
  239. mustdecrun:
  240.  dc.w 0
  241. magic:
  242.  dc.b 'LZH!'
  243.  
  244.  IFNE SFIRSTROUTINE
  245. ;***************************
  246. getdta:
  247.  lea dta(pc),a0
  248.  move.l d0,(a0)
  249.  dc.w $4ef9
  250. retgetdta:
  251.  dc.l $00
  252.  
  253. ;****************************
  254. setdta:
  255.  lea dta(pc),a0
  256.  move.l 2(a7),(a0)
  257.  dc.w $4ef9
  258. retsetdta:
  259.  dc.l $00
  260.  
  261. ;***********************************     FOR $4E (SFIRST)
  262. sfirst:
  263.  tst.l d0
  264.  bne pissoff
  265.  
  266.  move.l 2(a7),a0
  267.  
  268.  movem.l a1-a3,-(sp)
  269.  
  270.  move.w #$2,-(sp)
  271.  move.l a0,-(sp)
  272.  move.w #$3d,-(sp)
  273.  trap #1
  274.  addq.l #8,sp
  275.  lea sfirsthandle(pc),a1
  276.  move.w d0,(a1)
  277.  
  278.  move.w mustdecrun(pc),d0
  279.  cmp.w #1,d0
  280.  beq.s change
  281.  bra.s afterchange
  282.  
  283. change:
  284.  move.l dta(pc),a0
  285.  add.l #26,a0
  286.  move.l unpaklen(pc),d0
  287.  move.l d0,(a0)
  288.  
  289. afterchange:
  290.  move.w sfirsthandle(pc),-(sp)
  291.  move.w #$3e,-(sp)
  292.  trap #1
  293.  addq.l #4,sp
  294.  
  295.  movem.l (sp)+,a1-a3
  296.  
  297. pissoff:
  298.  dc.w $4ef9
  299. retsfirst:                               ;exit
  300.  dc.l $00
  301.  ENDC
  302.  
  303. ;***********************************     FOR $42 (LSEEK) IN TRAP1
  304.  IFNE LSEEKROUTINE
  305. lseek:
  306.  cmp.w #2,8(a7)
  307.  bne vamos3
  308.  cmp.l #0,2(a7)
  309.  bne vamos3
  310.  lea seekhandle(pc),a0
  311.  move.w 6(a7),(a0)
  312.  lea sd0save(pc),a0
  313.  move.l d0,(a0)
  314.  
  315.  move.w mustdecrun(pc),d0
  316.  cmp.w #1,d0
  317.  bne.s vamos 
  318.  move.l unpaklen(pc),d0
  319.  bra.s vamos3
  320.  
  321. vamos:
  322.  move.l sd0save(pc),d0
  323. vamos3:
  324.  dc.w $4ef9
  325. retlseek:                            ;exit
  326.  dc.l $00
  327.  ENDC
  328.  
  329. ;************************************    FOR $3F (READ) IN TRAP1
  330. decrunch:
  331.          ;a0 - start of crunched data
  332.          ;a1 - beginning of uncrunching area
  333.  
  334.  movem.l d0-d7/a0-a6,-(sp)
  335.  move.l buffer(pc),a0
  336.  lea origlen(pc),a1
  337.  move.l 4(a0),(a1)
  338.  
  339.  move sr,d1
  340.  btst #13,d1
  341.  bne nochange
  342.  
  343.  clr.l -(sp)
  344.  move.w #$20,-(sp)
  345.  trap #1
  346.  addq.l #6,sp
  347.  lea jek(pc),a6
  348.  move.l d0,(a6)
  349.  
  350.  lea mode(pc),a1
  351.  move.w #1,(a1)      ;1 denotes must return to user mode
  352.  
  353. nochange:
  354.  lea colstore(pc),a1
  355.  move.w $fff8240,(a1)
  356.  move.l buffer(pc),a0
  357.  move.l a0,a1
  358.  add.l #$20,a1
  359.  BSR DEPACK
  360.  move.w colstore(pc),$fff8240
  361.  
  362.                 ;restore memory saved in buffer
  363.  move.l buffer(pc),a1
  364.  lea savebuf,a2
  365.  move.l #$20,a3
  366. loadloop2:
  367.  move.b (a2)+,(a1)+
  368.  subq.l #1,a3
  369.  cmp.l #0,a3
  370.  bne.s loadloop2
  371.  
  372.  move.w mode(pc),d0
  373.  cmp.w #1,d0
  374.  bne nochange2
  375.  
  376.  move.l jek(pc),-(sp)
  377.  move.w #$20,-(sp)
  378.  trap #1
  379.  addq.l #6,sp
  380.  
  381. nochange2:
  382.  lea mode(pc),a1
  383.  move.w #$00,(a1)
  384.  movem.l (sp)+,d0-d7/a0-a6
  385.  move.l origlen(pc),d0
  386.  dc.w $4ef9
  387. return:                            ;exit decrunch module
  388.  dc.l $00
  389.  
  390.  
  391. * LZH DEPACKER For use with the JAM Packer V3.0/V4.0
  392. *
  393. * USAGE:
  394. * LEA $ADDRESS OF PACKED DATA,A0
  395. * LEA $ADDRESS TO UNPACK DATA TO,A1
  396. * BSR DEPACK
  397. *
  398. * NOTE: Must save registers before executing depack if original
  399. *       contents are required.
  400.  
  401. RESET   MOVEM.W D0-D1/D3/D5,-(A7)
  402.     MOVEA.L A1,A2
  403.     MOVEQ   #$00,D2
  404.     MOVEQ   #-$02,D4
  405.     MOVEQ   #$00,D1
  406.     MOVE.W  #$0139,D5
  407. OUTER    ADDQ.W  #2,D4
  408.     CMP.W   (A2)+,D7
  409.     BHI.S   OUTER
  410.     MOVE.W  $00(A3,D4.W),D3
  411.     ADDQ.W  #1,D3
  412.     LSR.W   #1,D3
  413.     CMP.W   -$02(A3,D2.W),D3
  414.     BLS.S     BIDDLE
  415.     MOVE.W  $00(A3,D1.W),D0
  416.     ADD.W   $02(A3,D1.W),D0
  417.     CMP.W   D0,D3
  418.     BLS.S    BIDDLE
  419. BITH    MOVE.W  D0,$00(A3,D2.W)
  420.     MOVE.W  D1,$00(A1,D2.W)
  421.     MOVE.W  D2,$00(A0,D1.W)
  422.     MOVE.W  D2,$02(A0,D1.W)
  423.     ADDQ.W  #2,D2
  424.     ADDQ.L  #4,D1
  425.     MOVE.W  $00(A3,D1.W),D0
  426.     ADD.W   $02(A3,D1.W),D0
  427.     CMP.W   D0,D3
  428.     BHI.S    BITH
  429. BIDDLE    MOVE.W  D3,$00(A3,D2.W)
  430.     MOVE.W  $00(A1,D4.W),D0
  431.     MOVE.W  D0,$00(A1,D2.W)
  432.     MOVE.W  D2,$00(A0,D0.W)
  433.     ADDQ.W  #2,D2
  434.     DBF     D5,OUTER
  435. MAKETABLE2
  436.     MOVE.W  $00(A3,D1.W),D0
  437.     ADD.W   $02(A3,D1.W),D0
  438.     MOVE.W  D0,$00(A3,D2.W)
  439.     MOVE.W  D1,$00(A1,D2.W)
  440.     MOVE.W  D2,$00(A0,D1.W)
  441.     MOVE.W  D2,$02(A0,D1.W)
  442.     ADDQ.W  #2,D2
  443.     ADDQ.L  #4,D1
  444.     CMP.W   D7,D2
  445.     BNE.S    MAKETABLE2
  446.     MOVEM.W (A7)+,D0-D1/D3/D5
  447.     RTS     
  448.  
  449. CREATE  MOVE.L    TABLE7(PC),A0
  450.     LEA     TDATA1(PC),A1
  451.     MOVEQ   #$00,D0
  452.     MOVEQ   #$1F,D1
  453.     MOVEQ   #$00,D2
  454. LOOP1   MOVE.B  D0,(A0)+
  455.     DBF     D1,LOOP1
  456.     DBF     D2,EXIT1
  457.     MOVE.W  (A1)+,D3
  458.     MOVEQ   #$03,D2
  459. EXIT1   ROL.W   #4,D3
  460.     MOVE.W  D3,D1
  461.     ANDI.W  #$000F,D1
  462.     ADDQ.B  #4,D0
  463.     BCC.S   LOOP1
  464.     MOVE.L    TABLE8(PC),A0
  465.     LEA     TDATA2(PC),A1
  466.     MOVEQ   #$05,D0
  467.     MOVEQ   #$03,D1
  468. LOOP2   MOVE.B  $00(A1,D0.W),D2
  469.     EXT.W   D2
  470. LOOP3   MOVE.B  D1,(A0)+
  471.     DBF     D2,LOOP3
  472.     ADDQ.